#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <stdbool.h>


typedef int ElemType;
typedef struct {
    ElemType *elem;//存储严肃的起始地址
    int TableLen;//元素个数
}SSTable;

void ST_Init(SSTable& ST, int len)
{
    ST.TableLen=len;
    ST.elem=(ElemType*)malloc(sizeof(ElemType)*ST.TableLen);
    int i;
    srand((unsigned int)time(NULL));
    for(i=0;i<ST.TableLen;i++) {
        ST.elem[i] = rand() % 100;//生成的是0~99之间的随机数
    }
}
//打印数组中的元素
void ST_Print(SSTable ST)
{
    for(int i=0;i<ST.TableLen;i++)
    {
        printf("%3d",ST.elem[i]);
    }
    printf("\n");
}
//交换两个元素
void Swap(int& a ,int& b)
{
    int tmp;
    tmp=a;
    a=b;
    b=tmp;
}
//往往都是用两层循环
//优先去写内层循环，再去写外层循环
void Bubble_Sort(ElemType *A, int n)
{
    int i, j;
    bool flag;
    for(i=0;i<n-1;i++)//控制的是有序数的数目
    {
        flag=false;
        for(j=n-1;j>i;j--)//内存控制比较和交换
        {
            if(A[j-1]>A[j])
            {
                Swap(A[j-1], A[j]);
                flag=true;
            }
        }
        if(false==flag)//如果一趟比较没有发生任何交换，说明数组有序，提前结束排序
        {
            return;
        }
    }
}
int main()
{
    SSTable ST;
    ST_Init(ST, 10);
    ST_Print(ST);//随机后的结果打印

//    ElemType A[10]={64,94,95,79,69,84,18,22,12,78};
//    //内存copy接口，当你copy整形数组，或者浮点型时，要用memcpy，不能用strcpy，初试考memcpy   概率很低
//    memcpy(ST.elem,A,sizeof(A));

    Bubble_Sort(ST.elem,10);
    ST_Print(ST);//随机后的结果打印

    return 0;
}

